【Android笔记】Activity 的创建过程
概述
上图为 Activity 在 Android-7.x 下的创建流程,图中所画涉及了两个进程中数个对象间的协作(之前的版本可能没有 ActivityStart 对象)。客户端进程为 Activity 所在的 app 进程,服务端进程为系统进程,客户端进程和服务端进程都通过 Binder 对象和对方通信。创建过程中的比较重要的对象及其职责:
- Instrumentation:监控应用与系统进程的交互和 Activity 的创建及其生命周期的执行,Activity 的生命周期方法需通过 Instrumentation 来进行调用,并且每个 Activity 中都有 Instrumentation 的引用,一个应用只有一个 Instrumentation。
- ActivityThread:定义了
main()
函数,应用程序的入口,代表着主线程,负责和 ActiviyManagerService 进行交互,并对 Activity 进行调度等工作。与 Instrumentation 的区别是:ActivityThread 通知 Instrumentation,而 Instrmentation 负责具体的执行。 - ActivityManagerService:负责 Activity(其实是四大组件)的创建、管理和调度等工作,运行在系统进程中。
- ActivityRecord:代表一个 Activity,包含有 Activity 的各中信息,存放在 TaskRecord 栈中。
- TaskRecord:即通常所说的 Activity 任务栈,内维护这一个
ArrayList
管理 ActivityRecord。 - ActivityStack:维护和管理 Activity 的状态。
- ActivityStackedSupervisor:内有多ActivityStack(
mHomeStack
,mFocusedStack
,mLastFocusedStack
),是比 ActivityStack 高一级的决策者。
上面三者的关系可表示成(图片来源:http://liuwangshu.cn/framework/ams/2-activitytask.html ):
创建流程
Activity 的启动从 ContextWrapper(Activity) 的 startActivity()
或者 startActivityForResult()
开始,然后交由 Instrumentation 对象去执行,显示执行 execStartActivities()
,再加上进程的 UserId 调用自身的 execStartActivitiesAsUser()
:
public void execStartActivitiesAsUser(Context who, IBinder contextThread,
IBinder token, Activity target, Intent[] intents, Bundle options,
int userId) {
...
//这里将调用的是 ActivityManagerProxy.startActivities()
int result = ActivityManagerNative.getDefault()
.startActivities(whoThread, who.getBasePackageName(), intents, resolvedTypes,
token, options, userId);
...
}
static public IActivityManager getDefault() {
return gDefault.get();
}
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
protected IActivityManager create() {
IBinder b = ServiceManager.getService("activity");
if (false) {
Log.v("ActivityManager", "default service binder = " + b);
}
IActivityManager am = asInterface(b);
if (false) {
Log.v("ActivityManager", "default service = " + am);
}
return am;
}
};
static public IActivityManager asInterface(IBinder obj) {
if (obj == null) {
return null;
}
IActivityManager in =
(IActivityManager)obj.queryLocalInterface(descriptor);
if (in != null) {
return in;
}
//返回 ActivityManagerService 在客户端的代理 ActivityManagerProxy
return new ActivityManagerProxy(obj);
}
ActivityManagerNative(AMN)和 AMS 都是 Binder 对象,而 gDefault 是一个单例模式的泛型封装类,类中代码 ServiceManager.getService("activity")
得到的是 AMS 在客户端的代理 ActivityManagerProxy 对象,也就是说创建流程执行到这儿后交给了系统进程的 AMS 对象去执行。
AMS 收到客户端的请求之后,先后调用自身的 startActivity()
和 startActivityAsUser()
方法,在后一个方法中流程传到了 ActivityStarter 对象当中。
ActivityStarter 对象先后调用了 startActivityMayWait()
、startActivityLocked()
和 startActivityUnchecked()
三个方法,这三个方法做的事大概是:从 Intent 和 其他对象中提取 Activity 的相关信息,然后生成 ActivityRecord 对象和 TaskRecord 对象,最后交给 ActivityStackedSupervisor 对象执行。
ActivityStackedSupervisor 和 ActivityStack 间有比较繁琐的调用过程,如上图,分别先后调用的方法如下:
- ActivityStackedSupervisor:
resumeFocusedStackTopActivityLocked()
、resumeTopActivityUncheckedLocked()
、startSpecificActivityLocked()
、realStartActivityLocked()
- ActivityStack :
resumeTopActivityUncheckedLocked()
、resumeTopActivityInnerLocked()
总的来说这两者是对 Activity 任务栈 和 Activity 进行了管理,最后调用的方法 realStartActivityLocked()
执行了:
final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
boolean andResume, boolean checkConfig) throws RemoteException {
...
app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken, System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration), new Configuration(task.mOverrideConfig), r.compat, r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results, newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);
...
}
app.thread
是一个 IApplicationThread 对象,而 IApplicationThread 继承了跨进程通用接口 IInterface,它的实现类是 ApplicationThreadNative,ApplicationThreadNative 还继承了 Binder,可见,当服务端执行结束之后返回给客户端时使用的也是 Binder。继承关系如下:
ApplicationThread 继承了 ApplicationThreadNative,ApplicationThread 是 ActivityThread 中的一个内部类,所以说最终的调用流程是回到了 ActivityThread 对象中:
public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
int procState, Bundle state, PersistableBundle persistentState,
List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) {
...
sendMessage(H.LAUNCH_ACTIVITY, r);
...
}
...
public void handleMessage(Message msg) {
if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
switch (msg.what) {
case LAUNCH_ACTIVITY: {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
final ActivityClientRecord r = (ActivityClientRecord) msg.obj;
r.packageInfo = getPackageInfoNoCheck(
r.activityInfo.applicationInfo, r.compatInfo);
handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
case RELAUNCH_ACTIVITY: {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityRestart");
ActivityClientRecord r = (ActivityClientRecord)msg.obj;
handleRelaunchActivity(r);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
case PAUSE_ACTIVITY: {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
SomeArgs args = (SomeArgs) msg.obj;
handlePauseActivity((IBinder) args.arg1, false,
(args.argi1 & USER_LEAVING) != 0, args.argi2,
(args.argi1 & DONT_REPORT) != 0, args.argi3);
maybeSnapshot();
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
...
//后面还有很多 case
}
切换到客户端进程以后,在 ApplicationThread 的 scheduleLaunchActivity()
中先是把服务端返回的信息封装成 ActivityClientRecord,由于是运行在 Binder 线程池中的线程,所以使用了 Handler 切换到主线程去执行,然后在主线程中:
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {
Activity a = performLaunchActivity(r, customIntent);
}
执行了 ActivityThread 的 performLaunchActivity()
,完成 Activity 的创建。
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
...
//1 创建 Activity 对象
activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent);
//2 创建 Application 对象
Application app = r.packageInfo.makeApplication(false, mInstrumentation);
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config,
r.referrer, r.voiceInteractor, window);
//3 创建上下文, Window 等
Context appContext = createBaseContextForActivity(r, activity);
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config,
r.referrer, r.voiceInteractor, window);
//4 调用 Actvity 对象的 onCreate()
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
}
//这是 Instrumentation 的方法,通过此方法创建 Activity
public Activity newActivity(ClassLoader cl, String className,
Intent intent)
throws InstantiationException, IllegalAccessException,
ClassNotFoundException {
return (Activity)cl.loadClass(className).newInstance();
}